#ifndef INIMANAGER_H
#define INIMANAGER_H

#include <QObject>
#include <QVariant>
#include <QMap>
#include <QMutex>
#include <QSettings>
#include <QScopedPointer>

class iniManager : public QObject
{
    Q_OBJECT
public:
    explicit iniManager(const QString &filePath, QObject *parent = nullptr);
    ~iniManager();

public:
    // 读取指定组和键的值，默认值为 QVariant()
    QVariant readValue(const QString &group, const QString &key, const QVariant &defaultValue = QVariant()) const;

    // 写入指定组和键的值，返回写入是否成功
    bool writeValue(const QString &group, const QString &key, const QVariant &value);

    // 添加一个组及其键值对，返回是否成功
    bool addGroup(const QString &group, const QVariantMap &keyValues);

    // 移除一个组，返回是否成功
    bool removeGroup(const QString &group);

    // 移除指定组中的一个键，返回是否成功
    bool removeValue(const QString &group, const QString &key);

    // 获取所有组名
    QStringList allGroups() const;

    // 获取指定组中的所有键
    QStringList allKeys(const QString &group) const;

    // 检查指定键值对是否存在，返回是否存在
    bool isExists(const QString &key, const QVariant &value) const;

    // 从Map批量写入键值对，返回是否成功
    bool writeValues(const QString &group, const QVariantMap &keyValues);

    // 同步设置到文件，返回同步是否成功
    bool sync();

    // 获取包含指定键和值的组，若没有返回空字符串
    QString getGroup(const QString &key, const QVariant &value) const;

private:
    QString m_filePath;                      // INI文件路径
    mutable QMutex m_mutex;                  // 用于线程安全的互斥锁
    QScopedPointer<QSettings> m_settings;    // 使用智能指针管理QSettings对象

    // 初始化设置
    void initSettings();
};

#endif // INIMANAGER_H
